package com.moyz.adi.common.validator;

import com.moyz.adi.common.annotation.AskReqCheck;
import com.moyz.adi.common.dto.AskReq;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import org.apache.commons.lang3.StringUtils;

import java.util.regex.Pattern;

/**
 * AskReqValidator 是一个自定义验证器，用于验证 {@link AskReq} 对象。
 * 它实现了 {@link ConstraintValidator} 接口，并指定了要验证的约束（AskReqCheck）和目标类型（AskReq）。
 */
public class AskReqValidator implements ConstraintValidator<AskReqCheck, AskReq> {

    /**
     * 初始化方法，在验证开始之前调用。
     * 该方法可以用来设置任何必要的初始化逻辑，但在这个例子中不需要任何初始化。
     *
     * @param constraintAnnotation 应用在验证器上的注解实例
     */
    @Override
    public void initialize(AskReqCheck constraintAnnotation) {
        // 无需校验或初始化操作
    }

    /**
     * 验证方法，检查 {@link AskReq} 对象是否符合预期的条件。
     * 如果验证失败，则抛出 IllegalArgumentException 异常并提供错误消息。
     *
     * @param value   要验证的 AskReq 实例
     * @param context 验证上下文，可用于定制错误消息等
     * @return 如果对象有效则返回 true；否则抛出异常
     */
    @Override
    public boolean isValid(AskReq value, ConstraintValidatorContext context) {
        // 检查 prompt 和 regenerateQuestionUuid 是否都为空
        if (StringUtils.isAllBlank(value.getPrompt(), value.getRegenerateQuestionUuid())) {
            throw new IllegalArgumentException("prompt 和 regenerateMsgUuid 不能同时为空");
        }

        // 定义 UUID 正则表达式，用于验证 conversationUuid 和 regenerateQuestionUuid 的格式
        String uuidRegex = "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$";

        // 检查 conversationUuid 是否符合 UUID 格式
        boolean isValidConversationUuid = Pattern.matches(uuidRegex, value.getConversationUuid());
        if (!isValidConversationUuid) {
            throw new IllegalArgumentException("conversation uuid 格式错误");
        }

        // 如果 regenerateQuestionUuid 不为空，则也检查其格式是否符合 UUID 标准
        if (StringUtils.isNotBlank(value.getRegenerateQuestionUuid())) {
            boolean isValidRegenerateUuid = Pattern.matches(uuidRegex, value.getRegenerateQuestionUuid());
            if (!isValidRegenerateUuid) {
                throw new IllegalArgumentException("regenerate question uuid 格式错误");
            }
        }

        return true; // 如果所有检查都通过，则返回 true
    }
}
